home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Spicy Pics!
/
Spicy Pics!.iso
/
amiga
/
gifmachn
/
sources
/
xcomp.c
< prev
Wrap
C/C++ Source or Header
|
1991-09-18
|
2KB
|
93 lines
/* Copyright 1990 by Christopher A. Wichura.
See file GIFMachine.doc for full description of rights.
*/
/* This function will take the gif screen we have read in and scale it to
one half of its previous X size.
What we do here is just a step above skipping every other pixel (like
most routines I have seen do). While we still put emphasis on the
even pixels, we at least take account of the odds next to them by
using a weighted average.
This method is by no means the best way to do this. If anyone wants
to build a smarter one I would be very interested in seeing it.
*/
#include "GIFMachine.h"
extern struct GIFdescriptor gdesc;
EXTERNBITPLANE;
extern char *AbortMsg;
extern BOOL DisplayCounts;
void DoXComp(void)
{
register UWORD x1;
register UWORD x2;
register UWORD y;
register UWORD num;
UWORD ColBuf[3];
UWORD NewWidth;
NewWidth = gdesc.gd_Width >> 1;
if (NewWidth & 1)
NewWidth++;
MyPrintf("...Compressing width to %ld.\n......", NewWidth);
if (DisplayCounts)
PutStr("Line ");
else
PutStr("Working");
Flush(Output());
for (y = 0; y < gdesc.gd_Height; y++) {
if (DisplayCounts)
MyPrintf("%5ld", y);
for (x1 = x2 = 0; x2 < gdesc.gd_Width; x1++, x2 += 2) {
num = 4;
ColBuf[0] = BitPlane[y][x2].rgb_Red * 4;
ColBuf[1] = BitPlane[y][x2].rgb_Green * 4;
ColBuf[2] = BitPlane[y][x2].rgb_Blue * 4;
if (x2 > 1) {
num += 2;
ColBuf[0] += BitPlane[y][x2 - 1].rgb_Red * 2;
ColBuf[1] += BitPlane[y][x2 - 1].rgb_Green * 2;
ColBuf[2] += BitPlane[y][x2 - 1].rgb_Blue * 2;
}
if (x2 + 1 < gdesc.gd_Width) {
num += 2;
ColBuf[0] += BitPlane[y][x2 + 1].rgb_Red * 2;
ColBuf[1] += BitPlane[y][x2 + 1].rgb_Green * 2;
ColBuf[2] += BitPlane[y][x2 + 1].rgb_Blue * 2;
}
BitPlane[y][x1].rgb_Red = ((ColBuf[0] + num / 2) / num);
BitPlane[y][x1].rgb_Green = ((ColBuf[1] + num / 2) / num);
BitPlane[y][x1].rgb_Blue = ((ColBuf[2] + num / 2) / num);
}
BitPlane[y][x1].rgb_Red = BitPlane[y][x1].rgb_Green = BitPlane[y][x1].rgb_Blue = 0;
if (SetSignal(0L, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C) {
MyPrintf("\n%s", AbortMsg);
MyExit(ABORTEXITVAL);
}
if (DisplayCounts)
PutStr("\x1B[5D");
}
MyPrintf("\x1B[%ldDCompressed. \n", (DisplayCounts ? 5 : 7));
gdesc.gd_Width = NewWidth;
}